<!DOCTYPE html>
<html lang="en-us">
<head><head>
    <meta name="referrer" content="no-referrer"/>
    <meta name="google-site-verification" content="9vIieCe-Qpd78QOmBl63rGtIVbhY6sYyuxX3j8XWBA4" />
    <meta name="baidu-site-verification" content="LRrmH41lz7" />
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="google-site-verification" content="xBT4GhYoi5qRD5tr338pgPM5OWHHIDR6mNg1a3euekI" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    
    <meta name="description" content="一年之后，让我们再来看看Istio 和 Envoy WebAssembly 可扩展性的发展现状">
    
    <meta name="keyword"  content="暴走的初号机, shinji3887, 暴走的初号机的网络日志, 暴走的初号机的博客, shinji3887 Blog, 博客, 个人网站, 互联网, Web, 云原生, PaaS, Istio, Kubernetes, 微服务, Microservice">
    <link rel="shortcut icon" href="/img/favicon.ico">

    <title>一年之后的 Istio 和 Envoy WebAssembly 可扩展性-同步率400%</title>

    <link rel="canonical" href="/post/wasm-progress/">

    <link rel="stylesheet" href="https://lupeier.cn-sh2.ufileos.com/iDisqus.min.css"/>
	
    
    <link rel="stylesheet" href="https://lupeier.cn-sh2.ufileos.com/bootstrap.min.css">

    
    <link rel="stylesheet" href="https://lupeier.cn-sh2.ufileos.com/hux-blog.min.css">

    
    <link rel="stylesheet" href="https://lupeier.cn-sh2.ufileos.com/syntax.css">

    
    <link rel="stylesheet" href="https://lupeier.cn-sh2.ufileos.com/zanshang.css">

    
    <link href="/css/font-awesome.min.css" rel="stylesheet" type="text/css">
    
    
    <script src="https://lupeier.cn-sh2.ufileos.com/jquery.min.js"></script>
    
    
    <script src="https://lupeier.cn-sh2.ufileos.com/bootstrap.min.js"></script>
    
    
    <script src="https://lupeier.cn-sh2.ufileos.com/hux-blog.min.js"></script>
</head>
</head>

<nav class="navbar navbar-default navbar-custom navbar-fixed-top">
    <div class="container-fluid">
        
        <div class="navbar-header page-scroll">
            <button type="button" class="navbar-toggle">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">L&#39;s Blog</a>
        </div>

        
        
        <div id="huxblog_navbar">
            <div class="navbar-collapse">
                <ul class="nav navbar-nav navbar-right">
                    <li>
                        <a href="/">Home</a>
                    </li>
                    
                    <li>
                        <a href="categories/tech">tech</a>
                    </li>
                    
                    <li>
                        <a href="categories/tips">tips</a>
                    </li>
                    
                    <li>
                        <a href="/about">About</a>
                    </li>
                    
                </ul>
            </div>
        </div>
        
    </div>
    
</nav>
<script>
    
    
    
    var $body   = document.body;
    var $toggle = document.querySelector('.navbar-toggle');
    var $navbar = document.querySelector('#huxblog_navbar');
    var $collapse = document.querySelector('.navbar-collapse');

    $toggle.addEventListener('click', handleMagic)
    function handleMagic(e){
        if ($navbar.className.indexOf('in') > 0) {
        
            $navbar.className = " ";
            
            setTimeout(function(){
                
                if($navbar.className.indexOf('in') < 0) {
                    $collapse.style.height = "0px"
                }
            },400)
        }else{
        
            $collapse.style.height = "auto"
            $navbar.className += " in";
        }
    }
</script>




<style type="text/css">
    header.intro-header{
        background-image: url('https://lupeier.cn-sh2.ufileos.com/pexels-sails-611328.jpg')
    }
</style>
<header class="intro-header" >
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <div class="post-heading">
                    <div class="tags">
                       
                       <a class="tag" href="/tags/kubernetes" title="Kubernetes">
                           Kubernetes
                        </a>
                        
                       <a class="tag" href="/tags/istio" title="Istio">
                           Istio
                        </a>
                        
                       <a class="tag" href="/tags/servicemesh" title="ServiceMesh">
                           ServiceMesh
                        </a>
                        
                    </div>
                    <h1>一年之后的 Istio 和 Envoy WebAssembly 可扩展性</h1>
                    <h2 class="subheading"></h2>
                    <span  class="meta">Posted by Istio.io on Friday, March 5, 2021
                        
                    </span>
					<br>
                </div>
            </div>
        </div>
    </div>
</header>




<article>
    <div class="container">
        <div class="row">

            
            <div class="
                col-lg-8 col-lg-offset-2
                col-md-10 col-md-offset-1
                post-container">

        		
                        <header>
                        <h2>TOC</h2>
                        </header>
                        <nav id="TableOfContents">
  <ul>
    <li>
      <ul>
        <li><a href="#webassembly支持在上游-envoy-中被合并">WebAssembly支持在上游 Envoy 中被合并</a></li>
        <li><a href="#wasm-extensions-ecosystem-仓库">wasm-extensions Ecosystem 仓库</a></li>
        <li><a href="#通过-istio-agent-分发-wasm-模块">通过 Istio Agent 分发 Wasm 模块</a></li>
        <li><a href="#istio-wasm-sig-和未来的工作">Istio Wasm SIG 和未来的工作</a></li>
      </ul>
    </li>
  </ul>
</nav>
        		
        		<blockquote>
<p>译者注：去年3月份，Istio 社区重磅推出了以 Wasm 技术为核心的 Proxy-Wasm plugins 体系，可扩展性和遥测技术的发展都将以 Wasm 技术为基础，具体可以看我之前的《WebAssembly in Envoy》、《重新定义代理的扩展性：WebAssembly在Envoy与Istio中的应用》这两篇文章。社区同时也在大力发展规范体系，这其实也是谷歌的一贯打法，即标准先行，所谓一流企业定标准。具体来说做了两件事情，第一是制定代理无关的 WebAssembly for Proxies (ABI specification)，第二是扶持以 solo 为首的初创企业高调推出 webassemblyhub，大力建设插件生态。如今正好过去了一年，Wasm 生态发展得如何了呢？Wasm Proxy Spec 规范是否能一统代理扩展插件的天下？让我们来看看官方发布的博客。</p>
</blockquote>
<p>一年前的今天，在 1.5 版本中，我们向 Istio 引入了<a href="https://istio.io/latest/zh/blog/2020/wasm-announce/">基于 WebAssembly 的可扩展性</a>。在这一年中，Istio，Envoy 和 Proxy-Wasm 社区一直在共同努力，以使 WebAssembly（Wasm）的扩展性稳定、可靠且易于采用。 让我们逐一介绍 Istio 1.9 版本中 Wasm 支持的更新以及我们的未来计划。</p>
<h3 id="webassembly支持在上游-envoy-中被合并">WebAssembly支持在上游 Envoy 中被合并</h3>
<p>自从在 Istio fork 的 Envoy 分支中添加了对 Wasm 和 WebAssembly for Proxies（Proxy-Wasm）ABI 的实验性支持之后，我们从早期采用者社区中收集了一些宝贵的反馈意见。这与开发核心 Istio Wasm 扩展所获得的经验相结合，帮助我们成熟并稳定了运行时。所有的这些工作，使得 Wasm 支持在2020年10月顺利的合并到 Envoy 上游，使其成为 Envoy 所有正式版本的一部分。 这是一个重要的里程碑，因为它表明：</p>
<ul>
<li>运行时已为广泛采用做好了准备。</li>
<li>ABI/API 的编程、扩展配置 API 和运行时行为正在变得稳定。</li>
<li>您可以期待更大范围的采用和社区支持。</li>
</ul>
<h3 id="wasm-extensions-ecosystem-仓库">wasm-extensions Ecosystem 仓库</h3>
<p>作为 Envoy Wasm 运行时的早期采用者，Istio 扩展和遥测工作组在开发扩展方面积累了很多经验。我们构建了几个一流的扩展，包括<a href="https://istio.io/latest/docs/reference/config/proxy_extensions/metadata_exchange/">元数据交换</a>，<a href="https://istio.io/latest/docs/reference/config/proxy_extensions/stats/">Prometheus统计信息</a>和<a href="https://istio.io/latest/docs/reference/config/proxy_extensions/attributegen/">属性生成</a>。为了更广泛地分享我们的知识，我们在 <strong>istio-ecosystem</strong> 组织中创建了<a href="https://github.com/istio-ecosystem/wasm-extensions"> wasm-extensions 存储库</a>。 该存储库有两个用途：</p>
<ul>
<li>它提供了规范的示例扩展，涵盖了一些非常需要的功能（例如<a href="https://github.com/istio-ecosystem/wasm-extensions/tree/master/extensions/basic_auth">基础身份验证</a>）。</li>
<li>它为 Wasm 扩展的开发、测试和发布提供了指南。该指南基于 Istio 可扩展性团队正在使用、维护和测试的相同的构建工具链和测试框架。</li>
</ul>
<p>该指南目前涵盖使用 C++ 进行 <a href="https://github.com/istio-ecosystem/wasm-extensions/blob/master/doc/write-a-wasm-extension-with-cpp.md">WebAssembly 扩展开发</a>和<a href="https://github.com/istio-ecosystem/wasm-extensions/blob/master/doc/write-cpp-unit-test.md">单元测试</a>，以及使用 Go 测试框架进行<a href="https://github.com/istio-ecosystem/wasm-extensions/blob/master/doc/write-integration-test.md">集成测试</a>，该框架通过使用 Istio 代理二进制文件运行 Wasm 模块来模拟实际运行时。将来，我们还将添加更多规范的扩展，例如与 Open Policy Agent 的集成以及基于 JWT 令牌的标头处理。</p>
<h3 id="通过-istio-agent-分发-wasm-模块">通过 Istio Agent 分发 Wasm 模块</h3>
<p>在 Istio 1.9 之前，需要 <a href="https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/core/v3/base.proto#config-core-v3-remotedatasource">Envoy 远程数据源</a>才能将远程 Wasm 模块分发到代理。在<a href="https://gist.github.com/bianpengyuan/8377898190e8052ffa36e88a16911910">此示例</a>中，您可以看到定义了两个 <code>EnvoyFilter</code> 资源：一个用于添加远程获取 Envoy 集群，另一个用于将 Wasm 过滤器注入到 HTTP 过滤器链中。这种方法有一个缺点：如果由于配置错误或瞬时错误而导致远程获取失败，Envoy 将被错误的配置阻塞。如果将 Wasm 扩展配置为<a href="https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/wasm/v3/wasm.proto#extensions-wasm-v3-pluginconfig">失败后关闭</a>，则错误的远程提取将停止 Envoy 的服务。若要解决此问题，需要对Envoy xDS 协议进行<a href="https://github.com/envoyproxy/envoy/issues/9447">根本性的修改</a>，以使其允许异步 xDS 响应。</p>
<p>Istio 1.9 通过利用 istio-agent 内的 xDS 代理和 Envoy 的<a href="https://www.envoyproxy.io/docs/envoy/latest/configuration/overview/extension">扩展配置发现服务</a>（ECDS），提供了一种现成的可靠分发机制。</p>
<p>istio-agent 从 istiod 拦截扩展配置资源更新，从中读取远程获取提示，下载 Wasm 模块，并使用下载的 Wasm 模块的路径重写 ECDS 配置。如果下载失败，istio-agent 将拒绝 ECDS 更新，并阻止错误的配置到达Envoy。有关更多详细信息，请参阅<a href="https://istio.io/latest/docs/ops/configuration/extensibility/wasm-module-distribution/">有关 Wasm 模块分发的文档</a>。</p>
<p><img src="https://istio.io/latest/blog/2021/wasm-progress/architecture-istio-agent-downloading-wasm-module.svg" alt="Remote Wasm module fetch flow"></p>
<h3 id="istio-wasm-sig-和未来的工作">Istio Wasm SIG 和未来的工作</h3>
<p>尽管我们在 Wasm 可扩展性方面取得了许多进展，但该项目仍有许多方面有待完成。为了巩固各方的努力并更好地应对未来的挑战，我们成立了 <a href="https://discuss.istio.io/t/introducing-wasm-sig/9930">Istio WebAssembly SIG</a>，旨在为 Istio 提供一种标准且可靠的方式来使用 Wasm 扩展。以下是我们正在从事的一些工作：</p>
<ul>
<li><strong>第一等的扩展 API</strong> ：目前需要通过 Istio 的 <code>EnvoyFilter</code> API 注入 Wasm 扩展。第一等的扩展 API 将使 Wasm 与 Istio 的使用更加容易，我们希望在 Istio 1.10 中引入它。</li>
<li><strong>制品分发的互操作性</strong>：标准的 Wasm 制品格式建立在 Solo.io 的 <a href="https://www.solo.io/blog/announcing-the-webassembly-wasm-oci-image-spec/">WebAssembly OCI 镜像规范工作</a>的基础上，可以轻松地构建、提取、发布和执行。</li>
<li><strong>基于容器存储接口（CSI）的制品分发</strong>：使用 istio-agent 分发模块很容易被采用，但可能效率不高，因为每个代理都将保留 Wasm 模块的副本。作为更有效的解决方案，使用 <a href="https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html">Ephemeral CSI</a>，将提供一个 DaemonSet，它可以配置 Pod 的存储。CSI 驱动程序的工作方式类似于 CNI 插件，将在 pod 启动时从 xDS 流中带外提取 Wasm 模块，并将其安装在<code>rootfs</code>中。</li>
</ul>
<p>如果您想加入我们，小组将每两周星期二下午2点（太平洋标准时间）开会。 您可以在 <a href="https://github.com/istio/community/blob/master/WORKING-GROUPS.md#working-group-meetings">Istio 工作组日历</a>上找到会议。</p>
<p>我们期待看到您将如何使用 Wasm 扩展 Istio！</p>
<p>原文：<a href="https://istio.io/latest/blog/2021/wasm-progress/#webassembly-support-merged-in-upstream-envoy">Istio and Envoy WebAssembly Extensibility, One Year On</a></p>

        
                
        
              <hr>
              <ul class="pager">
                  
                  <li class="previous">
                      <a href="/post/branching-patterns/" data-toggle="tooltip" data-placement="top" title="源代码分支管理模式">&larr; Previous Post</a>
                  </li>
                  
                  
              </ul>
  
              

<div id="gitalk-container"></div>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.css">
<script src="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js"></script>
<script src="/js/md5.min.js"></script>
<script>
	const gitalk = new Gitalk({
	  clientID: 'aff2580d8cc58af83367',
	  clientSecret: '747547f5f87fcc5145b847ab76a498d7e501319f',
	  repo: 'comment',
	  owner: 'shinji3887',
	  admin: ['shinji3887'],
	  id: md5(location.pathname),      
	  distractionFreeMode: false  
	})

	gitalk.render('gitalk-container')
</script>


            </div>
            
            <div class="
                col-lg-8 col-lg-offset-2
                col-md-10 col-md-offset-1
                sidebar-container">

                
                <section>
                    <hr class="hidden-sm hidden-xs">
                    <h5><a href="/tags/">FEATURED TAGS</a></h5>
                    <div class="tags">
                     
                    
                        
                            <a href="/tags/api-gateway" title="api-gateway">
                                api-gateway
                            </a>
                        
                    
                        
                    
                        
                            <a href="/tags/cloud-native" title="cloud-native">
                                cloud-native
                            </a>
                        
                    
                        
                            <a href="/tags/devops" title="devops">
                                devops
                            </a>
                        
                    
                        
                            <a href="/tags/docker" title="docker">
                                docker
                            </a>
                        
                    
                        
                    
                        
                    
                        
                    
                        
                    
                        
                            <a href="/tags/istio" title="istio">
                                istio
                            </a>
                        
                    
                        
                    
                        
                            <a href="/tags/kubernetes" title="kubernetes">
                                kubernetes
                            </a>
                        
                    
                        
                            <a href="/tags/microservice" title="microservice">
                                microservice
                            </a>
                        
                    
                        
                    
                        
                    
                        
                    
                        
                    
                        
                            <a href="/tags/restful" title="restful">
                                restful
                            </a>
                        
                    
                        
                    
                        
                            <a href="/tags/servicemesh" title="servicemesh">
                                servicemesh
                            </a>
                        
                    
                        
                            <a href="/tags/spring-cloud" title="spring-cloud">
                                spring-cloud
                            </a>
                        
                    
                        
                            <a href="/tags/vue" title="vue">
                                vue
                            </a>
                        
                    
                        
                    
                        
                    
                    </div>
                </section>

                
                <hr>
                <h5>FRIENDS</h5>
                <ul class="list-inline">
                    
                        <li><a target="_blank" href="https://skyao.io/">小剑的博客</a></li>
                    
                        <li><a target="_blank" href="https://zhaohuabing.com/">huabing的博客</a></li>
                    
                        <li><a target="_blank" href="http://blog.didispace.com/">程序猿DD的博客</a></li>
                    
                </ul>
            </div>
        </div>
    </div>
</article>




<footer>
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <ul class="list-inline text-center">
                   
                   <li>
                       <a href="" rel="alternate" type="application/rss+xml" title="L&#39;s Blog" >
                           <span class="fa-stack fa-lg">
                               <i class="fa fa-circle fa-stack-2x"></i>
                               <i class="fa fa-rss fa-stack-1x fa-inverse"></i>
                           </span>
                       </a>
                   </li>
                   
                    
                    <li>
                        <a href="mailto:18016380795@163.com">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-envelope fa-stack-1x fa-inverse"></i>
                            </span>
                        </a>
                    </li>
		    
                    
                    
                    
                    

                    

		    
                    
                    <li>
                        <a target="_blank" href="/link%20of%20wechat%20QR%20code%20image">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-wechat fa-stack-1x fa-inverse"></i>
                            </span>
                        </a>
                    </li>
		    
                    
                    <li>
                        <a target="_blank" href="https://github.com/shinji3887">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-github fa-stack-1x fa-inverse"></i>
                            </span>
                        </a>
                    </li>
		    
                    
                    <li>
                        <a target="_blank" href="https://www.linkedin.com/in/lupeier">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-linkedin fa-stack-1x fa-inverse"></i>
                            </span>
                        </a>
                    </li>
		    
                </ul>
		<p class="copyright text-muted">
                    Copyright &copy; L&#39;s Blog , 2021
                    <br>
                    <br>
                    <a href="http://icp.chinaz.com/info?q=lupeier.com" target="_blank">备案号：沪ICP备19022667号-1</a>                    
                </p>
            </div>
        </div>
    </div>
</footer>



<script>
    function async(u, c) {
      var d = document, t = 'script',
          o = d.createElement(t),
          s = d.getElementsByTagName(t)[0];
      o.src = u;
      if (c) { o.addEventListener('load', function (e) { c(null, e); }, false); }
      s.parentNode.insertBefore(o, s);
    }
</script>






<script>
    
    if($('#tag_cloud').length !== 0){
        async("/js/jquery.tagcloud.js",function(){
            $.fn.tagcloud.defaults = {
                
                color: {start: '#bbbbee', end: '#0085a1'},
            };
            $('#tag_cloud a').tagcloud();
        })
    }
</script>


<script>
    async("/js/fastclick.js", function(){
        var $nav = document.querySelector("nav");
        if($nav) FastClick.attach($nav);
    })
</script>


<script>
    (function(){
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https'){
       bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
      }
      else{
      bp.src = 'http://push.zhanzhang.baidu.com/push.js';
      }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>







</body>
</html>
